home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1992 / 09 / 2 / window-machine / wm_source.ampk / WM_Start.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  11.9 KB  |  605 lines

  1. #include <WM.h>
  2. #include <MyStructs.h>
  3.  
  4. extern struct NewWindow WWindow,SWindow,MenuWindow,ItemWindow;
  5. extern struct NewWindow IWindow,BWindow,IMWindow,GWindow,MSWindow;
  6. extern struct NewWindow PRWindow,AlertWindow,REQWindow,AREQWindow;
  7. extern ULONG gflags;
  8. extern struct Image LOGOImage,WMImage;
  9.  
  10. /*    Hauptprogramm        */
  11.  
  12. _main()
  13. {
  14.     ReqProc=(struct Process *)FindTask(0L);
  15.     ReqProc->pr_Task.tc_UserData=ReqProc->pr_WindowPtr;
  16.     ReqProc->pr_WindowPtr=(APTR)-1;
  17.  
  18.     if(!(IntuitionBase = (struct IntuitionBase *)
  19.         OpenLibrary("intuition.library", 0)))
  20.     {
  21.         CloseAll();
  22.         return(1);
  23.     }
  24.             
  25.     if(!(GfxBase = (struct GfxBase *)
  26.          OpenLibrary("graphics.library", 0)))
  27.     {
  28.         CloseAll();
  29.         return(2);
  30.     }
  31.  
  32.     if(!(LayersBase = (struct LayersBase *)
  33.          OpenLibrary("layers.library", 0)))
  34.     {
  35.         CloseAll();
  36.         return(2);
  37.     }
  38.     ok=1;
  39.     PREFSBYTE[0]=0;
  40.     if(!(Datei=Open("WM_Prefs",MODE_OLDFILE))) ok=0;
  41.     else
  42.     {
  43.         if(read=Read(Datei,PREFSBYTE,sizeof(PREFSBYTE)) !=
  44.             sizeof(PREFSBYTE)) ok=0;
  45.         if(read=Read(Datei,WMColors,sizeof(WMColors)) !=
  46.             sizeof(WMColors)) ok=0;
  47.         Close(Datei);
  48.     }
  49.     if(ok) NewPrefs();
  50.     if(GfxBase->DisplayFlags != NTSC)
  51.     {
  52.         WMScreen.Height=256;
  53.         WMWindow.Height=245;
  54.         FWindow.TopEdge=28;
  55.         FWindow.Height=200;
  56.         ErrWindow.TopEdge=103;
  57.         SWindow.TopEdge=33;
  58.         WWindow.TopEdge=31;
  59.         IWindow.TopEdge=56;
  60.         BWindow.TopEdge=43;
  61.         IMWindow.TopEdge=71;
  62.         GWindow.TopEdge=28;
  63.         GWindow.Height=200;
  64.         MenuWindow.TopEdge=26;
  65.         ItemWindow.TopEdge=26;
  66.         MenuWindow.Height=204;
  67.         ItemWindow.Height=204;
  68.         MSWindow.TopEdge=46;
  69.         PRWindow.TopEdge=43;
  70.         AlertWindow.TopEdge=78;
  71.         REQWindow.TopEdge=48;
  72.         AREQWindow.TopEdge=55;
  73.     }
  74.     if(!(WMsc=(struct Screen *)OpenScreen(&WMScreen)))
  75.     {
  76.         CloseAll();
  77.         return(3);
  78.     }
  79.     WMWindow.Screen=WMsc;
  80.     sc=WMsc;
  81.     WMvp=WMsc->ViewPort;
  82.     LoadRGB4(&WMvp,WMColors,4);
  83.     if(!(WMwin = (struct Window *)OpenWindow(&WMWindow)))
  84.     {
  85.         CloseAll();
  86.         return(4);
  87.     }
  88.     Copyright();
  89.     if(!(StdFont=(struct TextFont *)OpenFont(&ZS8)))
  90.     {
  91.         CloseAll();
  92.         return(5);
  93.     }
  94.     if(!(timerport=CreatePort(PORTNAME,0)))
  95.     {
  96.         CloseAll();
  97.         return(6);
  98.     }
  99.     if(OpenDevice(TIMERNAME,UNIT_VBLANK,&timereq,0))
  100.     {
  101.         CloseAll();
  102.         return(7);
  103.     }
  104.     TimerStart();
  105.     suffix++;
  106.     do
  107.     {
  108.     if(awin) SetWD();
  109.  
  110.     waitmask = Wait((1L << WMwin->UserPort->mp_SigBit) |
  111.             (1L << timerport->mp_SigBit) );
  112.     if(waitmask & (1L << timerport->mp_SigBit))
  113.     {
  114.         if(WMwin != NULL && IntuitionBase->ActiveWindow != WMwin)
  115.         {
  116.             ok=1;
  117.             helpS=firstS;
  118.             while(helpS)
  119.             {
  120.                 if(TestWin(helpS->FirstWindow,IntuitionBase->ActiveWindow))
  121.                 {
  122.                     ok=0;
  123.                     break;
  124.                 }
  125.                 helpS=helpS->NextScreen;
  126.             }
  127.             if(ok) TestWin(noscW,IntuitionBase->ActiveWindow);
  128.         }
  129.         TimerStart();
  130.     }
  131.     if(waitmask & (1L << WMwin->UserPort->mp_SigBit)) {
  132.     while(WMmsg=(struct IntuiMessage*)GetMsg(WMwin->UserPort))
  133.     {
  134.         class=WMmsg->Class;
  135.         code=WMmsg->Code;
  136.         move=0;
  137.         if(class==MENUVERIFY)
  138.         {
  139.             if(WMsc->TopEdge) MoveScreen(WMsc,0,-(WMsc->TopEdge));
  140.             ScreenToFront(WMsc);
  141.             move=1;
  142.         }
  143.         ReplyMsg((struct Message *)WMmsg);
  144.         if(class==MENUPICK && MENUNUM(code) != MENUNULL)
  145.             DoMenu();
  146.         if(move) ScreenToFront(sc);
  147.     } /* while */
  148.     } /* if */
  149.     } while(EndeWM); /* do */
  150.     CloseAll();
  151.     return(0);
  152. } /* main */
  153.  
  154. VOID WMOn()
  155. {
  156.     WMwin=(struct Window *)OpenWindow(&WMWindow);
  157.     Copyright();
  158.     WindowToBack(WMwin);
  159. }
  160. VOID Copyright()
  161. {
  162.     WMrp=WMwin->RPort;
  163.     WinBorder(WMwin);
  164.     i = (WMsc->Height == 256) ? 35 : 15;
  165.     DrawImage(WMrp,&WMImage,180,i);
  166.     text(WMrp,2,"Copyright 1990/91 by",237,i+125);
  167.     text(WMrp,1,"Copyright 1990/91 by",235,i+124);
  168.     text(WMrp,2,"Arno Pichler",269,i+135);
  169.     text(WMrp,3,"Arno Pichler",267,i+134);
  170.     text(WMrp,2,"Fritz-Schaeffer-Str. 8",229,i+145);
  171.     text(WMrp,3,"Fritz-Schaeffer-Str. 8",227,i+144);
  172.     text(WMrp,2,"W-8201 Ostermuenchen",237,i+155);
  173.     text(WMrp,3,"W-8201 Ostermuenchen",235,i+154);
  174.     SetMenuStrip(WMwin,&WMMenu6);
  175. }
  176. VOID DoMenu()
  177. {
  178.     switch(MENUNUM(code))
  179.     {
  180.         /* Menu ALERT */
  181.         case 7: switch(ITEMNUM(code))
  182.             {
  183.                 case 0: if(sc==WMsc)
  184.                     {
  185.                         if(NewWin(3)) Error(0,1,1);
  186.                         else SaveOk=1;
  187.                     }
  188.                     break;
  189.                 case 1: /* DefAlert */
  190.                     if(DefAlert()) Error(0,1,1);
  191.                     break;
  192.                 case 2: /* AlertText */
  193.                     if(DefText(0)) Error(0,1,1);
  194.                     break;
  195.             }
  196.             break;
  197.         /* Menu AUTO-REQUEST */
  198.         case 6: switch(ITEMNUM(code))
  199.             {
  200.                 case 0: if(NewWin(2))
  201.                     {
  202.                         Error(0,1,1);
  203.                         break;
  204.                     }
  205.                     SaveOk=1;
  206.                     break;
  207.                 case 1: /* DefAutoReq */
  208.                     if(DefAutoReq()) Error(0,1,1);
  209.                     break;
  210.                 case 2: /* BodyText */
  211.                     if(DefText(0)) Error(0,1,1);
  212.                     break;
  213.                 case 3: /* PositiveText */
  214.                     agad=awin->FirstGadget->NextGadget;
  215.                     if(DefText(1)) Error(0,1,1);
  216.                     break;
  217.                 case 4: /* NegativeText */
  218.                     agad=awin->FirstGadget;
  219.                     if(DefText(1)) Error(0,1,1);
  220.                     break;
  221.             }
  222.             break;
  223.         /* Menu REQUESTER */
  224.         case 5: switch(ITEMNUM(code))
  225.             {
  226.                 case 0: if(NewWin(1)) Error(0,1,1);
  227.                     else SaveOk=1;
  228.                     break;
  229.                 case 1: if(NewReqDef()) Error(0,1,1);
  230.                     break;
  231.                 case 2: /* ReqBorder */
  232.                     BType=2;
  233.                     if(NewBorDef()) Error(0,1,1);
  234.                     break;
  235.                 case 3: /* ReqText */
  236.                     if(DefText(0)) Error(0,1,1);
  237.                     break;
  238.                 case 4: /* ReqBitMap */
  239.                     DefImage(7);
  240.                     break;
  241.             }
  242.             break;
  243.         /* Menu GADGET */
  244.         case 4: switch(ITEMNUM(code))
  245.             {
  246.                 case 0:    DrawGad();
  247.                     break;
  248.                 case 1: if(NewGadDef()) Error(0,1,1);
  249.                     break;
  250.                 case 2: if(MoveGadget(1)) Error(0,1,1);
  251.                     break;
  252.                 case 3: if(MoveGadget(0)) Error(0,1,1);
  253.                     break;
  254.                 case 4: if(SearchGad()) break;
  255.                     if(agad->FirstText==NULL)
  256.                     {
  257.                         firstT=NULL;
  258.                         lastT=NULL;
  259.                         if(WriteText(1)==3) break;
  260.                         agad->FirstText=firstT;
  261.                     }
  262.                     if(DefText(1)) Error(0,1,1);
  263.                     break;
  264.                 case 5: if(SearchGad()) break;
  265.                     if((agad->GadgetType & 3) == 3)
  266.                     {
  267.                         Error(16,1,0);
  268.                         break;
  269.                     }
  270.                     BType=0;
  271.                     if(NewBorDef()) Error(0,1,1);
  272.                     break; 
  273.                 case 6:
  274.                 case 7: d=ITEMNUM(code)-6;
  275.                     if(SearchGad()) break;
  276.                     DefImage(d);
  277.                     break;
  278.                 case 8: if(awin->FirstGadget)
  279.                         PlaceGadget();
  280.                     break;
  281.             }
  282.             break;
  283.  
  284.         /* Menu MENU */
  285.         case 3: switch(ITEMNUM(code))
  286.             {
  287.                 case 0:    MWinOn(WMwin);
  288.                     WMwin=NULL;
  289.                     MenuWindow.CheckMark=NULL;
  290.                     ItemWindow.CheckMark=NULL;
  291.                     if(awin->CheckMark)
  292.                     {
  293.                         helpI=awin->CheckMark;
  294.                         MenuWindow.CheckMark=&helpI->Image;
  295.                         ItemWindow.CheckMark=&helpI->Image;
  296.                     }
  297.                     MenuWindow.DetailPen=awin->DetailPen;
  298.                     MenuWindow.BlockPen=awin->BlockPen;
  299.                     ItemWindow.DetailPen=awin->DetailPen;
  300.                     ItemWindow.BlockPen=awin->BlockPen;
  301.                     if(awin->MenuStrip)
  302.                         ClearMenuStrip(awin->win);
  303.                     if(DefMenu()) Error(0,1,1);
  304.                     WMOn();
  305.                     break;
  306.                 case 1: awin->win->Flags ^= RMBTRAP;
  307.                     ModifyIDCMP(awin->win,MOUSEBUTTONS);
  308.                     MWinOn(WMwin);
  309.                     SetMenuStrip(awin->win,&awin->MenuStrip->Menu);
  310.                     ActivateWindow(awin->win);
  311.                     ok=1;
  312.                     while(ok)
  313.                     {
  314.                         Wait(1L << awin->win->UserPort->mp_SigBit);
  315.                         GetMessage(awin->win);
  316.                         if(class==MOUSEBUTTONS &&
  317.                             code==SELECTDOWN)
  318.                                 ok=0;
  319.                     }
  320.                     awin->win->Flags |= RMBTRAP;
  321.                     ModifyIDCMP(awin->win,NULL);
  322.                     WMOn();
  323.                     break;
  324.                 case 2: if(Error(20,1,1)==0) break;
  325.                     Work();
  326.                     DelMenuAll();
  327.                     ClearMenuStrip(awin->win);
  328.                     ClearMenuStrip(WMwin);
  329.                     WMItem5.Flags=ItemOff;
  330.                     WMItem5b.Flags=ItemOff;
  331.                     SetMenuStrip(WMwin,&WMMenu6);
  332.                     Ready();
  333.                     break;
  334.                 case 3: DefImage(6);
  335.                     if(awin->CheckMark)
  336.                         CheckItem();
  337.                     break;
  338.             }
  339.             break;
  340.  
  341.         /* Menu WINDOW */
  342.         case 2: switch(ITEMNUM(code))
  343.             {
  344.                 case 0: if(NewWin(0)) Error(0,1,1);
  345.                     else SaveOk=1;
  346.                     break;
  347.                 case 1: if(NewWinDef()) Error(0,1,1);
  348.                     break;
  349.                 case 2: clone=1;
  350.                     err=CloneWindow();
  351.                     clone=0;
  352.                     if(err)
  353.                     {
  354.                         Ready();
  355.                         Permit();
  356.                         if(err==2) CloseWin(awin);
  357.                         Error(0,1,1);
  358.                         break;
  359.                     }
  360.                     break;
  361.                 case 3: if(WriteText(0)==1) Error(0,1,1);
  362.                     break;
  363.                 case 4: if(DefText(0)) Error(0,1,1);
  364.                     break;
  365.             }
  366.             break;
  367.  
  368.         /* Menu SCREEN */
  369.         case 1: switch(ITEMNUM(code))
  370.             {
  371.                 case 0: if(NewSc()) Error(0,1,1);
  372.                     else SaveOk=1;
  373.                     break;
  374.                 case 1: if(NewScDef()) Error(0,1,1);
  375.                     break;
  376.                 case 2: if(DefPalette()) Error(0,1,1);
  377.                     break;
  378.             }
  379.             break;
  380.  
  381.         /* Menu PROJECT */
  382.         case 0: switch(ITEMNUM(code))
  383.             {
  384.                 case 0: if(SaveData(0)==1)
  385.                     {
  386.                         Ready();
  387.                         Error(1,1,1);
  388.                     }
  389.                     else SaveOk=0;
  390.                     if(Datei) Close(Datei);
  391.                     break;
  392.                 case 1: if(SaveOk)
  393.                     {
  394.                         if(Error(3,1,1)==0)
  395.                             break;
  396.                     }
  397.                     err=LoadData(0);
  398.                     if(Datei) Close(Datei);
  399.                     if(err != 2) Ready();
  400.                     if(err==1)
  401.                     {
  402.                         Error(1,1,1);
  403.                         ClearAll();
  404.                     }
  405.                     if(err==3) Error(4,1,1);
  406.                     break;
  407.                 case 2: if(SaveData(1)==1)
  408.                     {
  409.                         Ready();
  410.                         Error(1,1,1);
  411.                     }
  412.                     if(Datei) Close(Datei);
  413.                     break;
  414.                 case 3: err=LoadData(1);
  415.                     if(Datei) Close(Datei);
  416.                     if(err != 2) Ready();
  417.                     if(err==1)
  418.                     {
  419.                         Error(1,1,1);
  420.                         ClearAll();
  421.                     }
  422.                     if(err==3) Error(4,1,1);
  423.                     if(err==4) Error(18,1,1);
  424.                     break;
  425.                 case 4: if(MakeSource()) Error(0,1,1);
  426.                     break;
  427.                 case 5: if(Prefs()) Error(0,1,1);
  428.                     break;
  429.                 case 6: if(SaveOk)
  430.                     {
  431.                         if(Error(2,1,1)==0)
  432.                             break;
  433.                     }
  434.                     else if(Error(9,1,0)==0)
  435.                             break;
  436.                     Work();
  437.                     ClearAll();
  438.                     Ready();
  439.                     break;
  440.                 case 7: if(SaveOk)
  441.                     {
  442.                         if(Error(8,1,1)==0)
  443.                             break;
  444.                     }
  445.                     else
  446.                     {
  447.                         if(Error(7,1,0)==0)
  448.                             break;
  449.                     }
  450.                     EndeWM=FALSE;
  451.                     break;
  452.             }
  453.             break;
  454.     } /* switch */
  455. }
  456.  
  457. VOID Work()
  458. {
  459.     ActivateWindow(WMwin);
  460.     SetPointer(WMwin,Wecker,20,15,0,0);
  461. }
  462. VOID Ready()
  463. {
  464.     ClearPointer(WMwin);
  465. }
  466. USHORT TestWin(struct MyWindow *w,struct Window *t)
  467. {
  468.     FW=w;
  469.     while(w)
  470.     {
  471.         if(t == w->win)
  472.         {
  473.             ActivateWindow(WMwin);
  474.             if(w != awin)
  475.             {
  476.                 Work();
  477.                 awin=w;
  478.                 asc=w->Wsc;
  479.                 sc=w->Screen;
  480.                 vp=&sc->ViewPort;
  481.                 firstW=FW;
  482.                 WFolge();
  483.                 nosc=asc;
  484.                 SetNewWin(0);
  485.                 ScreenToFront(sc);
  486.                 Ready();
  487.             }
  488.             return(1);
  489.         }
  490.         w=w->NextWindow;
  491.     }
  492.     return(0);
  493. }
  494. VOID TestWindow()
  495. {
  496.     ok=1;
  497.     helpS=firstS;
  498.     while(helpS)
  499.     {
  500.         if(TestWin(helpS->FirstWindow,(struct Window *)layer->Window))
  501.         {
  502.             ok=0;
  503.             break;
  504.         }
  505.         helpS=helpS->NextScreen;
  506.     }
  507.     if(ok) TestWin(noscW,(struct Window *)layer->Window);
  508. }
  509. VOID SetWD()
  510. {
  511.     if(awin->LeftEdge != awin->win->LeftEdge)
  512.     {
  513.         awin->LeftEdge=awin->win->LeftEdge;
  514.         NW=1;
  515.     }
  516.     if(awin->TopEdge != awin->win->TopEdge)
  517.     {
  518.         awin->TopEdge=awin->win->TopEdge;
  519.         NW=1;
  520.     }
  521.     if(awin->Width != awin->win->Width)
  522.     {
  523.         NW=1;
  524.     }
  525.     if(awin->Height != awin->win->Height)
  526.     {
  527.         NW=1;
  528.     }
  529.     if(NW)
  530.     {
  531.         SaveOk=1;
  532.         SetNewWin(1);
  533.     }
  534. }
  535. VOID TimerStart()
  536. {
  537.     timereq.tr_time.tv_secs=0;
  538.     timereq.tr_time.tv_micro=2500;
  539.     timereq.tr_node.io_Message.mn_ReplyPort = timerport;
  540.     timereq.tr_node.io_Command=TR_ADDREQUEST;
  541.     timereq.tr_node.io_Flags=0;
  542.     timereq.tr_node.io_Error=0;
  543.     SendIO(&timereq.tr_node);
  544. }
  545. VOID CloseAll()
  546. {
  547.     AbortIO(&timereq.tr_node);
  548.     if(timereq.tr_node.io_Message.mn_ReplyPort) CloseDevice(&timereq);
  549.     if(timerport) DeletePort(timerport);
  550.     FreeFiles();
  551.     ClearAll();
  552.     if(StdFont) CloseFont(StdFont);
  553.     if(WMwin) MWinOn(WMwin);
  554.     if(WMsc) CloseScreen(WMsc);
  555.     if(LayersBase) CloseLibrary(LayersBase);
  556.     if(GfxBase) CloseLibrary(GfxBase);
  557.     if(IntuitionBase) CloseLibrary(IntuitionBase);
  558.     ReqProc->pr_WindowPtr=(APTR)ReqProc->pr_Task.tc_UserData;
  559.     ReqProc->pr_Task.tc_UserData=0;
  560. }
  561.  
  562. VOID ClearAll()
  563. {
  564.     while(firstS)
  565.     {
  566.         CloseAwinAll(firstS->FirstWindow);
  567.         CloseScreen(firstS->sc);
  568.         helpS=firstS->NextScreen;
  569.         FreeMem(firstS,sizeof(struct MyScreen));
  570.         firstS=helpS;
  571.     }
  572.     firstS=NULL;
  573.     lastS=NULL;
  574.     asc=NULL;
  575.     nosc=NULL;
  576.     Sok=0;
  577.     sc=WMsc;
  578.     if(noscW)
  579.     {
  580.         CloseAwinAll(noscW);
  581.         noscW=NULL;
  582.     }
  583.     SaveOk=0;
  584.     MenuOff();
  585. }
  586.  
  587. struct Layer *GetMouseLayer()
  588. {
  589.     register struct Layer *layer = NULL;
  590.     register short mousey = IntuitionBase->MouseY;
  591.     register short mousex = IntuitionBase->MouseX;
  592.     sc = IntuitionBase->FirstScreen;
  593.  
  594.         while(sc)
  595.     {
  596.         if (!(sc->ViewPort.Modes & LACE)) mousey >>= 1;
  597.         if (!(sc->ViewPort.Modes & HIRES)) mousex >>= 1;
  598.         if (layer = (struct Layer *)WhichLayer(&sc->LayerInfo,
  599.             mousex,mousey - sc->ViewPort.DyOffset)) break;
  600.         if (mousey >= sc->ViewPort.DyOffset) break;
  601.         sc=sc->NextScreen;
  602.     }
  603.     return(layer);
  604. }
  605.